Also see core-practices-over-time.html.
dat <- import(here("data/longitudinal", "full-tags-wide.csv"))
dictionary <- import(here("data/2024 data", "dictionary_2024.csv"))
source(here("scripts/branding.R"))
Which core practices have been implemented most over time?
core_prac <- dat %>%
select(school_id, year, starts_with("core")) %>%
mutate(school_id = as.factor(school_id),
year = as.factor(year))
core_prac[is.na(core_prac)] <- 0
core_prac <- core_prac %>%
# summarise(across(where(is.numeric), ~ sum(.x, na.rm = TRUE))) %>%
pivot_longer(starts_with("core"),
names_to = "core_practice",
values_to = "times_selected")
core_prac_dat <- core_prac %>%
group_by(core_practice) %>%
summarise(selected = sum(times_selected)) %>%
arrange(-selected)
First note: there are 26 practices that have never been selected as a
core practice. They are the following:
core_prac_dat %>%
filter(selected == 0) %>%
pull(core_practice)
## [1] "core_data_instruction" "core_design_margins"
## [3] "core_devices_home" "core_ell_supports"
## [5] "core_equity_plan" "core_experiential"
## [7] "core_flexible_schedule" "core_graduation_supports"
## [9] "core_hiring_practices" "core_immigrants_supports"
## [11] "core_information_formats" "core_learner_agency"
## [13] "core_local_global" "core_maker"
## [15] "core_measures_climate" "core_measures_college"
## [17] "core_measures_purpose" "core_oer"
## [19] "core_other_leaders" "core_poverty_supports"
## [21] "core_quality_materials" "core_relevant_learning"
## [23] "core_rigorous_coursework" "core_sel_plan"
## [25] "core_staffing_infrastructure" "core_wraparound"
These are the rest.
Let’s look more closely at the top 10 on this list.
top_core <- core_prac_dat %>%
head(10) %>%
pull(core_practice)
top_core_dat <- core_prac %>%
filter(core_practice %in% top_core) %>%
group_by(core_practice, year) %>%
summarise(selected = sum(times_selected))
top_core_dat %>%
filter(year != 2019) %>%
ggplot(aes(reorder(core_practice, selected), selected, fill = year)) +
geom_col() +
scale_fill_manual(values = transcend_cols) +
scale_y_continuous(expand = c(0,0)) +
labs(title = "Core Practices by Year Implemented",
x = "",
y = "") +
# scale_x_discrete(labels = label_tags()) +
theme(legend.position = "bottom",
legend.direction = "horizontal",
text = element_text(size = 7),
axis.text.x = element_text(angle = 45, hjust = 1)) +
coord_flip() +
theme(
panel.grid.major.y = element_blank(),
legend.position = "bottom"
)

It looks like 2021 was really driving the top core practices list
across the years.
Have any lost popularity over the last 5 years?
Well, this is an interesting question given that 2021 seems like it
was the year that schools were more liberal with their core practice
selections, so I imagine this affects most practices. But let’s look at
them below.
p <- core_prac %>%
group_by(core_practice, year) %>%
summarise(selected = sum(times_selected)) %>%
filter(year != 2019) %>%
mutate(year = as.numeric(year)) %>%
ggplot(aes(year, selected, color = core_practice)) +
geom_point() +
geom_line() +
scale_fill_manual(values = transcend_cols2) +
scale_y_continuous(expand = c(0,0)) +
labs(title = "Core Practices by Year Implemented",
x = "",
y = "") +
# scale_x_discrete(labels = label_tags()) +
theme(legend.position = "none",
legend.direction = "horizontal",
text = element_text(size = 7),
axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(
panel.grid.major.y = element_blank(),
legend.position = "none"
)
ggplotly(p, tooltip = c("core_practice", "selected"))
Which are the oldest stable core tags and newest growing tags?
stable_prac <- core_prac %>%
group_by(core_practice, year) %>%
summarise(selected = sum(times_selected)) %>%
filter(year != 2019) %>%
group_by(core_practice) %>%
summarise(
min_selected = min(selected, na.rm = TRUE),
max_selected = max(selected, na.rm = TRUE),
range_selected = max_selected - min_selected
) %>%
filter(range_selected <= 50) %>%
pull(core_practice)
p <- core_prac %>%
group_by(core_practice, year) %>%
summarise(selected = sum(times_selected)) %>%
filter(year != 2019) %>%
filter(core_practice %in% stable_prac) %>%
filter(selected > 20) %>%
mutate(year = as.numeric(year)) %>%
ggplot(aes(year, selected, color = core_practice)) +
geom_point() +
geom_line() +
scale_fill_manual(values = transcend_cols2) +
scale_y_continuous(expand = c(0,0)) +
labs(title = "Stable Tags (Selected >20, varied <50)",
x = "",
y = "") +
# scale_x_discrete(labels = label_tags()) +
theme(legend.position = "none",
legend.direction = "horizontal",
text = element_text(size = 7),
axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(
panel.grid.major.y = element_blank(),
legend.position = "none"
)
ggplotly(p, tooltip = c("core_practice", "selected"))
For newest growing tags, in my first pass, I am going to filter the
practices to those that increased between 2022 and 2024. I’m omitting
2021 for the filter.
increased_prac <- core_prac %>%
group_by(core_practice, year) %>%
summarise(selected = sum(times_selected)) %>%
filter(year %in% c(2022, 2024)) %>%
pivot_wider(names_from = year, values_from = selected, names_prefix = "year_") %>%
mutate(change = year_2024 - year_2022) %>%
filter(change > 0) %>%
arrange(desc(change)) %>%
pull(core_practice)
p <- core_prac %>%
group_by(core_practice, year) %>%
summarise(selected = sum(times_selected)) %>%
filter(year != 2019) %>%
filter(core_practice %in% increased_prac) %>%
mutate(year = as.numeric(year)) %>%
ggplot(aes(year, selected, color = core_practice)) +
geom_point() +
geom_line() +
scale_fill_manual(values = transcend_cols2) +
scale_y_continuous(expand = c(0,0)) +
labs(title = "Tags Increasing since 2022",
x = "",
y = "") +
# scale_x_discrete(labels = label_tags()) +
theme(legend.position = "none",
legend.direction = "horizontal",
text = element_text(size = 7),
axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(
panel.grid.major.y = element_blank(),
legend.position = "none"
)
ggplotly(p, tooltip = c("core_practice", "selected"))
core_prac %>%
group_by(core_practice, year) %>%
summarise(selected = sum(times_selected)) %>%
filter(year != 2019) %>%
filter(year != 2021) %>%
filter(core_practice %in% increased_prac) %>%
ggplot(aes(reorder(core_practice, selected), selected, fill = year)) +
geom_col() +
scale_fill_manual(values = transcend_cols) +
scale_y_continuous(expand = c(0,0)) +
labs(title = "Practices Increasing in Selection Since 2022",
x = "",
y = "") +
# scale_x_discrete(labels = label_tags()) +
theme(legend.position = "bottom",
legend.direction = "horizontal",
text = element_text(size = 7),
axis.text.x = element_text(angle = 45, hjust = 1)) +
coord_flip() +
theme(
panel.grid.major.y = element_blank(),
legend.position = "bottom"
)

What about those with the largest change?
core_prac %>%
group_by(core_practice, year) %>%
summarise(selected = sum(times_selected)) %>%
filter(year %in% c(2022, 2024)) %>%
pivot_wider(names_from = year, values_from = selected, names_prefix = "year_") %>%
mutate(change = year_2024 - year_2022) %>%
filter(change > 0) %>%
arrange(desc(change)) %>%
head(10) %>%
ggplot(aes(x = year_2022, xend = year_2024, y = reorder(core_practice, change), yend = core_practice)) +
geom_segment(color = "black", linetype = "dotted") +
geom_point(aes(x = year_2022), color = "red") +
geom_point(aes(x = year_2024), color = "blue") +
guides(col = guide_legend(nrow = 1, title = NULL)) +
geom_text(
aes(x = (year_2022 + year_2024)/2 -1, label = paste("Δ =", year_2024 - year_2022), color = factor(sign(year_2024 - year_2022))),
nudge_y = .3,
hjust = 0,
show.legend = FALSE
) +
labs(
y = "Core Practice",
x = "Times Selected",
title = "Core Practices with largest increase \nfrom 2022 to 2024 Across Schools"
) +
theme(
panel.grid.major.y = element_blank(),
legend.position = "bottom",
axis.text.y = element_text(size = rel(0.6))
)

What is the relationship between core practices most implemented
over time and practices on the horizon? (i.e., are we seeing a lot of
“brand new” practices piloted, are schools more or less trying out
“established” practices, or both?)
core_prac <- dat %>%
select(school_id, year, starts_with("core"))
long_dat <- import(here("data/longitudinal", "longitudinal_data.csv"))
Hm, I don’t see pilot in either dataset. Will explore later